\(~\) \(~\)
\(~\) \(~\)
This is an appendix to our study, “Attitudes toward Redistribution Thirty Years After: Theoretical and Empirical Reflections on Svallfors’ (1997) Findings”
In 1997, Stefan Svallfors “(1997)” published, “Worlds of Welfare and Attitudes to Redistribution: A Comparison of Eight Western Nations” in which he analyzed data from the 1992 ‘Social Inequality Module’ of the International Social Survey Program (ISSP). He wanted to understand how attitudes are structured in various welfare regimes. For twenty years, his study has been a standard citation in scholarship on comparative welfare states and social policy preferences. The ISSP was the first macro-comparative survey of policy preferences, and Svallfors’ work was one of the first to compare attitudes toward redistribution in as many as eight countries using the 1992 data (there as a ISSP in 1985 but it only had 5 countries). In this paper we revisit his path-breaking work in light of theories of policy preferences. We replicate his work, we further investigate his measurement and distributional assumptions about attitudes toward redistribtuion, and we then expand his original work to include more recent waves of ISSP data.
GESIS provides the ISSP 1992 ‘Social Inequality’ data “ZA2310.dta”.
However, these data have both non-response and the response choice “Can’t choose” coded as missing (“.” in Stata). Therefore, we contaced GESIS and got the file ZA2310_2006-07-18.dta, which we suspect is likely just the old SPSS version transferred into Stata (“ZA2310_2006-07-18.sav"”)
His original study used three questions:
It is the responsibility of the government to reduce the differences between people with high incomes and those with low incomes? –> v57
The government should provide a job for everyone who wants one? –> v59
The government should provide everyone with a guaranteed basic income? –> v62
He constructed a “government index” scale from the three questions as follows:
“For this purpose, an additive index was constructed from the three items, dividing between ‘strongly agree’ and ‘agree’ (2); ‘neither agree nor disagree’ (1); and ‘disagree’ and ‘strongly disagree’ (0). These items were summed, creating an index which may vary between 0 and 6, where 0 means disagreeing with all three propositions and thereby endorsing a clear-cut anti-interventionist stand and 6 means a strong interventionist standpoint“ (Svallfors 1997: 289).
He used eight country cases:
Swe, Nor, Ger, Aut, Aus, Nz, Can, USA Theese are in v3 coded as Swe=10,Nor=9,GermanyW=2,Aut=6,Aus=1,NZ=16,Can=17,US=5
Note that this part will go in an online appendix. When we arrive at the linear models we cannot replicate his results exactly. Some of the differences are worrysome. This is not the main point of our paper. Nate contacted some colleagues at Svallfors dept. and they siad they did not expect him to have the original data or code. Nate contacted GESIS about an earlier version of the ISSP 1992 and they said they had no record of one. Nate contacted ISSP principals Jonathan Kelley and Mariah Evans about the possibility of an earlier data version, but they have not yet replied (16.03.2020)
We imported the original dataset (SocIn92) and then generate a recoded dataset (SocIn92recode). We create new variables by recoding the above mentioned variables following Svallfors workflow.
socIn92recode <- socIn92m %>%
dplyr::mutate(
r1= car::recode(socIn92m$v57,recodes = '1:2=2; 3=1; 4:5=0; 8:9=NA'),
r2= car::recode(socIn92m$v59,recodes = '1:2=2; 3=1; 4:5=0; 8:9=NA'),
r3= car::recode(socIn92m$v62,recodes = '1:2=2; 3=1; 4:5=0; 8:9=NA'),
# Here we create Svallfors additive index "govermental index". Cases with at least one NA value are automatically excluded.
govIndex = r1+ r2+ r3,
# to measure the percentage of people agreeing (answer category 1 and 2). Needed for table 1.
r1p= car::recode(socIn92m$v57,recodes = '1:2=100; 3:5=0'),
r2p= car::recode(socIn92m$v59,recodes = '1:2=100; 3:5=0'),
r3p= car::recode(socIn92m$v62,recodes = '1:2=100; 3:5=0')
)%>%
# Now we reduce our dataset to the countries Svallfors includes in his analysis (dyplr:filter).
dplyr::filter(
v3 %in% c(2,5,17,6,1,16,9,10)
)
# We remove all cases with NA values in the variables (complete.cases)
socIn92recode<-socIn92recode[complete.cases(socIn92recode$r1),]
socIn92recode<-socIn92recode[complete.cases(socIn92recode$r2),]
socIn92recode<-socIn92recode[complete.cases(socIn92recode$r3),]
# Second dataset, 'can't choose included'
socIn92recodem <- socIn92m %>%
dplyr::mutate(
r1= car::recode(socIn92m$v57,recodes = '1:2=2; 3=1; 4:5=0; 8=8; 9=NA'),
r2= car::recode(socIn92m$v59,recodes = '1:2=2; 3=1; 4:5=0; 8=8; 9=NA'),
r3= car::recode(socIn92m$v62,recodes = '1:2=2; 3=1; 4:5=0; 8=8; 9=NA'))%>%
dplyr::filter(
v3 %in% c(2,5,17,6,1,16,9,10)
)
Table 1 Svallfors
Now that we have prepared our variables, we construct Table 1: Attitudes to redistribution in eight nations:
# First, we creat vectors with the country means of our variables r1p, r2p, r3p (tapply).
govinc<-tapply(socIn92recode$r1p,socIn92recode$v3,mean)
govjobs<-tapply(socIn92recode$r2p,socIn92recode$v3,mean)
govbas<-tapply(socIn92recode$r3p,socIn92recode$v3,mean)
# We make a table in form of a dataframe with the just created vectors (rbind) and sort the columns of the table following Svallfors.
table1<-as.data.frame(rbind(govinc,govjobs,govbas))
table1<-table1[,c(6,5,2,4,1,7,8,3)]
# We create a vector with the country names in the same order (->cnt) and a vector with the questions belonging to the variables (-> item.table1). The first is used as column names, the latter as row names.
cnt<-c("Swe","Nor","Ger","Aut","Aus","NZ","Can","USA")
item.table1<-c("It is the responsibility of the government to reduce the differences between people with high incomes and those with low incomes?","The government should provide a job for everyone who wants one?","The government should provide everyone with a guaranteed basic income?")
row.names(table1)<-item.table1
colnames(table1) = cnt
#Finally, we creat a HTML table (knitr:kable).
t1 <- knitr::kable(table1,format="html", digits = round(1), caption = "Table 1. \"Table 1\" in Svallfors (1997): Attitudes to redistribution in eight nations. Percentage agreeing with certain propositions")
# extraKabel to better column spacing
column_spec(t1, 2:9, "4em")
| Swe | Nor | Ger | Aut | Aus | NZ | Can | USA | |
|---|---|---|---|---|---|---|---|---|
| It is the responsibility of the government to reduce the differences between people with high incomes and those with low incomes? | 52.3 | 60.0 | 65.2 | 69.3 | 42.5 | 53.1 | 47.6 | 38.3 |
| The government should provide a job for everyone who wants one? | 71.3 | 78.4 | 65.4 | 72.1 | 39.2 | 49.3 | 39.8 | 46.4 |
| The government should provide everyone with a guaranteed basic income? | 42.5 | 78.2 | 57.9 | 51.1 | 50.7 | 60.6 | 48.4 | 34.1 |
This table uses the dplyr::mutate function to obtain weighted means using the ISSP provided weights, we should check these at some point - are the provided for each country? are they plausible?.
socIn92recode<-socIn92recode %>%
group_by(v3)%>%
dplyr::mutate(
wmean_r1p = weighted.mean(r1p,v176),
wmean_r2p = weighted.mean(r2p,v176),
wmean_r3p = weighted.mean(r3p,v176))
govinc_w<-tapply(socIn92recode$wmean_r1p,socIn92recode$v3,mean)
govjobs_w<-tapply(socIn92recode$wmean_r2p,socIn92recode$v3,mean)
govbas_w<-tapply(socIn92recode$wmean_r3p,socIn92recode$v3,mean)
table1_w<-as.data.frame(rbind(govinc_w,govjobs_w,govbas_w))
table1_w<-table1_w[,c(6,5,2,4,1,7,8,3)]
row.names(table1_w)<-item.table1
colnames(table1_w) = cnt
t2 <- knitr::kable(table1_w,format="html", digits = round(1), caption = "Table 2. Weighted Version of Table 1")
column_spec(t2, 2:9, "4em")
| Swe | Nor | Ger | Aut | Aus | NZ | Can | USA | |
|---|---|---|---|---|---|---|---|---|
| It is the responsibility of the government to reduce the differences between people with high incomes and those with low incomes? | 53.2 | 60.6 | 65.2 | 69.8 | 42.5 | 53.1 | 47.8 | 39.2 |
| The government should provide a job for everyone who wants one? | 73.2 | 78.9 | 65.4 | 72.3 | 39.2 | 49.3 | 40.9 | 47.3 |
| The government should provide everyone with a guaranteed basic income? | 44.7 | 78.4 | 57.9 | 50.3 | 50.7 | 60.6 | 49.5 | 35.0 |
Table 2 Svallfors
Here we replicate Tabel 2: Index distribution in the same way we constructed Table 1.
#mean and standard deviation
govIndexmean<-tapply(socIn92recode$govIndex,socIn92recode$v3,mean)
govIndexsd<-tapply(socIn92recode$govIndex,socIn92recode$v3,sd)
#cronbach's alpha by country (here for the recoded variable r1,r2,r3 = 394:396!)
a <- list(1,2,5,6,9,10,16,17)
cronalpha <- round(unlist(as.data.frame(sapply(a, function(x) {
c <-socIn92recode[which(socIn92recode$v3 == x),c(394:396)]
cronbach.alpha(c)
}))[1,]),2)
table2[3,] <- cronalpha
table2<-as.data.frame(rbind(govIndexmean,govIndexsd,cronalpha))
table2<-table2[,c(6,5,2,4,1,7,8,3)]
item.table2<-c("Mean","Standard Deviation", "Cronbach's alpha")
row.names(table2)<- item.table2
colnames(table2)<- cnt
t3 <- knitr::kable(table2,format="html", digits = round(2), caption = "Table C. Government Index Descriptives and Alpha (replication of \"Table 2\" in Svallfors (1997)")
column_spec(t3, 2:9, "4em")
| Swe | Nor | Ger | Aut | Aus | NZ | Can | USA | |
|---|---|---|---|---|---|---|---|---|
| Mean | 3.93 | 4.72 | 4.21 | 4.29 | 3.26 | 3.73 | 3.24 | 2.86 |
| Standard Deviation | 1.85 | 1.66 | 1.96 | 1.71 | 2.10 | 2.01 | 2.18 | 2.29 |
| Cronbach’s alpha | 0.64 | 0.64 | 0.70 | 0.52 | 0.70 | 0.63 | 0.73 | 0.79 |
From the start of this project we noticed small differences in the descriptive statistics between the original Svallfors study and ours. We suspect this is due to our usage of the GESIS 1992 ISSP data versus Svallfors’ 1992 data file which was not cleaned, standardized and archived. We plan to contact Svallfors when our work is closer to completion to ask about these descrepancies.
Appendix Table D demonstrates the differences between our results and Svallfors’ results. Panel A has unweighted and Panel B weighted differences in means.
#Now we want to compare our results for table 1 with the results of Svallfors
#Here we create a copy of table 1 with the original values of Svallfors
table1Sval<-data.frame(matrix(c(53.7,74.1,45.5,60.0,78.3,78.4,65.5,66.3, 58.1,69.5,72.1,51.2, 42.6, 39.4, 50.9, 53.1, 49.1, 60.5, 47.9, 40.1, 48.6, 38.3, 47.1, 34.2),nrow = 3,ncol = 8))
row.names(table1Sval)<-item.table1
colnames(table1Sval) = cnt
#The deviations of our replicated table and the original table in Svallfors' article.
table1diff <- round(table1 - table1Sval,2)
#Here our weighted table versus his original table.
table1diff_w <- round(table1_w - table1Sval,2)
# Code to produce the two tables
t4a <- knitr::kable(table1diff, format="html", digits = round(3), caption = "Panel A. Unweighted Discrepancies")
column_spec(t4a, 2:9, "4em")
t4b <- knitr::kable(table1diff_w, format="html", digits = round(3), caption = "Panel B. Weighted Discrepancies")
column_spec(t4b, 2:9, "4em")
tableA2 <- round(as.data.frame(sapply(list(10,9,2,6,1,16,17,5), function(x) {
d <<- newdata[which(newdata$v3 == x),]
tapply(d$govIndex,d$egp6, mean)
})),2)
colnames(tableA2) <- c("Swe","Nor","Ger","Aut","Aus","NZ","Can","USA")
t5 <- knitr::kable(tableA2,format="html", digits = round(2), caption = "Table E. Distribution of \'Government Index\' by EGP Class and Country. Part of Svallfors\' \"Table A2\"")
column_spec(t5, 2:9, "4em")
| Swe | Nor | Ger | Aut | Aus | NZ | Can | USA | |
|---|---|---|---|---|---|---|---|---|
| Routine | 4.07 | 5.02 | 4.29 | 4.16 | 3.26 | 3.70 | 3.54 | 3.00 |
| Self | 3.21 | 4.25 | 3.54 | 3.94 | 2.60 | 2.84 | 2.98 | 2.10 |
| Service I | 3.12 | 3.65 | 2.98 | 3.90 | 2.55 | 2.67 | 2.47 | 2.03 |
| Service II | 3.47 | 4.44 | 4.02 | 3.43 | 3.08 | 3.54 | 3.46 | 2.40 |
| Skilled | 4.56 | 5.10 | 4.60 | 4.60 | 3.72 | 4.39 | 3.45 | 3.59 |
| Unskilled | 4.40 | 5.24 | 4.86 | 5.43 | 3.29 | 3.50 | 6.00 | 2.88 |
newdata$female<-car::recode(newdata$v99, recodes = '1=0; 2=1')
newdata$empl<-car::recode(newdata$v104, recodes = '1:3=0; 5=1; c(4,6,8,9,10)=3; 7=2')
newdata$unskilled<-car::recode(newdata$egp6, recodes = '"Service I"=4; "Service II"=3; "Routine"=2; "Self"=5; "Skilled"=1;"Unskilled"=0')
m1nor<- lm(govIndex~female+factor(unskilled)+factor(empl),data = newdata, subset = (v3 %in% c(9)))
m1ger<- lm(govIndex~female+factor(unskilled)+factor(empl),data = newdata, subset = (v3 %in% c(2)))
m1aus<- lm(govIndex~female+factor(unskilled)+factor(empl),data = newdata, subset = (v3 %in% c(1)))
m1usa<- lm(govIndex~female+factor(unskilled)+factor(empl),data = newdata, subset = (v3 %in% c(5)))
table4<- stargazer(m1nor, m1ger, m1aus, m1usa, title= "Table 4",type = "text", single.row = TRUE, report = "vc*", star.cutoffs = c(0.05,0.01,0.001), covariate.labels = c("Female", "Skilled", "Routine non-manual", "Service class II", "Service class I", "Self-employed", "Unemployed", "Retired", "Others not in labor force"), column.labels = c("Norway", "Germany", "Australia", "USA"))
##
## Table 4
## ===============================================================================================================================
## Dependent variable:
## -----------------------------------------------------------------------------------------------------
## govIndex
## Norway Germany Australia USA
## (1) (2) (3) (4)
## -------------------------------------------------------------------------------------------------------------------------------
## Female 0.602*** 0.515*** 0.129 0.604***
## Skilled -0.238 -0.116 0.455 0.641
## Routine non-manual -0.511 -0.655* -0.073 -0.165
## Service class II -0.956*** -0.804* -0.188 -0.667
## Service class I -1.542*** -1.576*** -0.675 -0.883
## Self-employed -0.979** -1.057** -0.603 -0.743
## Unemployed 0.798*** 0.631* 0.098 0.402
## Retired 0.257 0.005 0.056 -0.318
## Others not in labor force 0.032 0.197 0.229 0.131
## factor(empl)99 0.438 0.601* 0.736
## Constant 4.984*** 4.481*** 3.158*** 2.667***
## -------------------------------------------------------------------------------------------------------------------------------
## Observations 1,232 1,511 1,671 1,103
## R2 0.122 0.078 0.042 0.093
## Adjusted R2 0.115 0.073 0.036 0.085
## Residual Std. Error 1.593 (df = 1221) 1.890 (df = 1501) 2.062 (df = 1660) 2.188 (df = 1092)
## F Statistic 17.020*** (df = 10; 1221) 14.128*** (df = 9; 1501) 7.244*** (df = 10; 1660) 11.196*** (df = 10; 1092)
## ===============================================================================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
#to make it a file
table4 %>% paste(., collapse="\n") %>% cat("\n")
##
## Table 4
## ===============================================================================================================================
## Dependent variable:
## -----------------------------------------------------------------------------------------------------
## govIndex
## Norway Germany Australia USA
## (1) (2) (3) (4)
## -------------------------------------------------------------------------------------------------------------------------------
## Female 0.602*** 0.515*** 0.129 0.604***
## Skilled -0.238 -0.116 0.455 0.641
## Routine non-manual -0.511 -0.655* -0.073 -0.165
## Service class II -0.956*** -0.804* -0.188 -0.667
## Service class I -1.542*** -1.576*** -0.675 -0.883
## Self-employed -0.979** -1.057** -0.603 -0.743
## Unemployed 0.798*** 0.631* 0.098 0.402
## Retired 0.257 0.005 0.056 -0.318
## Others not in labor force 0.032 0.197 0.229 0.131
## factor(empl)99 0.438 0.601* 0.736
## Constant 4.984*** 4.481*** 3.158*** 2.667***
## -------------------------------------------------------------------------------------------------------------------------------
## Observations 1,232 1,511 1,671 1,103
## R2 0.122 0.078 0.042 0.093
## Adjusted R2 0.115 0.073 0.036 0.085
## Residual Std. Error 1.593 (df = 1221) 1.890 (df = 1501) 2.062 (df = 1660) 2.188 (df = 1092)
## F Statistic 17.020*** (df = 10; 1221) 14.128*** (df = 9; 1501) 7.244*** (df = 10; 1660) 11.196*** (df = 10; 1092)
## ===============================================================================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
newdata2<- subset(newdata,v3==5)
gmean<-tapply(newdata2$govIndex,newdata2$egp,mean)
gsd<-tapply(newdata2$govIndex,newdata2$egp,sd)
table6<-as.data.frame(rbind(gmean,gsd))
knitr::kable(table6,format="html", digits = round(2), caption = "Exploring the Standard Deviations to Understand Discrepancies")
| I Service class I | II Service class II | III.a Routine non-manual, higher grade | III.b Routine non-manual, lower grade | IV.a Self-employed with employees | IV.b Self-employed with no empoyees | IV.c Self-employed Farmers etc | V Manual supervisors/Lower grade technicians | VI Skilled workers | VII.a Unskilled workers | VII.b Farm labours | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| gmean | 2.03 | 2.40 | 2.54 | 3.46 | 2.04 | 2.09 | 2.26 | 3.29 | 3.77 | 2.50 | 3.43 |
| gsd | 2.19 | 2.11 | 2.31 | 2.24 | 2.17 | 2.28 | 1.88 | 2.26 | 2.16 | 2.72 | 1.72 |